<?php

if (!isset($code_widgets)) $code_widgets = dirname(__FILE__);

require_once 'includes/php.php';

$this->useClass("Handler_Community");

class Action_Community_ShowDashboard extends Handler_Community
{

	var $ajax_functions = array(
		'ajax_showConfig', // выводит конфиг сообщества (сами виджеты + расположение пока там)
		'ajax_updateLayout', // обновляет расположение виджетов
		'ajax_addWidget', // добавляет новый фиджет
		'ajax_renderWidget', // возвращает отрендеренный виджет
		'ajax_getSettingsHtml', // возвращает шаблон с настройками виджета
		'ajax_updateSettings', // обновляет настройки виджета
		'ajax_deleteWidget', // удаляет виджет
		'ajax_execWidget'
	);
	public $moderator_mode = false;

	public function ajax_deleteWidget ( $widget_id )
	{
		$this->ctx->db->begin();
		$community_config = $this->model->getConfig($this->aa->acl_data['comity_oid']);

		unset($community_config['widgets'][ $widget_id ]);

		foreach($community_config['widgets_layout'] as $column=>$layout) {
			$key = array_search($widget_id, $layout);
			if ($key!==false) {
				unset($community_config['widgets_layout'][$column][$key]);
			}

		}

		// сохраняем
		$this->model->saveConfig($this->aa->acl_data['comity_oid'], $community_config);
		$this->ctx->db->end();

		$this->ctx->cp->set_data( $widget_id );
	}

	public function ajax_updateSettings( $_params )
	{
		php_parse_str($_params, $params);
		$this->ctx->db->begin();
		$community_config = $this->model->getConfig($this->aa->acl_data['comity_oid']);

		if ($params['widget_id']>0) {
			$widget_id = $params['widget_id'];
			$widget = $this->widgets[ $widget_id ];

			$widget->beforeUpdateSettings($params);

			unset ($params['widget_id']);

			$community_config['widgets'][ $widget_id ]['params'] = $params;

			// сохраняем
			$this->model->saveConfig($this->aa->acl_data['comity_oid'], $community_config);

			$this->ctx->cp->set_data( $widget_id );

		} else {
			$this->ctx->cp->set_data( -1 );
		}
		$this->ctx->db->end();

	}

	public function ajax_showConfig()
	{
		var_dump($this->model->getConfig($this->aa->acl_data['comity_oid']));
	}

	public function ajax_getSettingsHtml( $widget_id )
	{
		$widget = $this->widgets[ $widget_id ];

		if (!isset($widget)) return false;

		$w_name = get_class($widget);

		$form_data = $widget->settingsForm();

		$w_settings = get_object_vars($widget);
		$w_settings['id'] = $widget_id;

		if (isset($form_data)) {
			require_once 'includes/form.php';
			$w_settings['form'] = init_form($form_data);
		}

		$wg_view = $this->rh->views->findByName('WG_'.$w_name.':settings');
		if ($wg_view) {
			$wg_view->data['settings'] = $w_settings;
			$this->ctx->cp->set_data( $wg_view->getContent() );
		}

	}

	public function ajax_renderWidget ( $widget_id )
	{
		$cp = &$this->ctx->cp;

		$nd_html = &$cp->add_node('html');

		$widget = $this->widgets[ $widget_id ];
		if ($widget) {
			$view = $widget->getView();
			$view->data['widget'] = $widget->render();

			$html = $view->getContent();
			$nd_html->set_data( $html );

			$nd_id = &$cp->add_node('widget_id');
			$nd_id->set_data( $widget_id );

		}
	}

	public function ajax_execWidget ( $widget_id, $widget_func, $widget_fparams )
	{
		// этот код выполняет какую-либо функцию виджета, рендеринг должна производить эта функция

		$cp = &$this->ctx->cp;

		$widget = $this->widgets[ $widget_id ];
		$content = $widget->$widget_func($widget_fparams);


		// эта штука из многомерного массива $content создаст такой же по вложенности xml код.
		// атрибуты будут названы по названиям ключей

		function walk_callback($item, $key, $parent_node)
		{
			if (gettype($item)=='array') {
				$_pn = &$parent_node->add_node($key);
				array_walk($item, 'walk_callback', $_pn);
			} else {
				$_pn = &$parent_node->add_node($key);
				$_pn->set_data( $item );
			}

		}
		array_walk($content, 'walk_callback', $cp);
		$wid = $cp->add_node("widget_id");
		$wid->set_data($widget_id);
	}

	public function ajax_addWidget ( $column, $type )
	{
		// $column - колонка куда добавить, $type - тип виджета который добавить

		$this->ctx->db->begin();
		$column = substr($column, 6,6);

		// итак находим объект сообщества, затем переопределяем массив config и сохраняем
		$widget = array(
			"params"=>array(), // параметры виджета
			"name"=>$type,
		);

		// получим текукщий элемент, не забываем что есть еще постоянные виджеты, котоыре также занимают идшники
		// поэтому берем из общего конфига
		$widgets = $this->getWidgetsConfig();
		$widgets[] = $widget;
		end($widgets);

		$new_widget_id = key($widgets);

		$community_config = $this->model->getConfig($this->aa->acl_data['comity_oid']);

		$community_config[ 'widgets' ][$new_widget_id] = $widget; // добавим виджет в конец массива
		array_unshift( $community_config[ 'widgets_layout' ][ $column ], $new_widget_id );

		// сохраняем
		$this->model->saveConfig($this->aa->acl_data['comity_oid'], $community_config);
		$this->ctx->db->end();

		$this->ctx->cp->set_data( $new_widget_id );

	}

	public function ajax_updateLayout ( $column, $layout )
	{

		$this->ctx->db->begin();
		// тут поидее $layout это одномерный массив с widget_id, их последовательность и есть layout

		$column = substr($column, 6, 6);

		// итак находим объект сообщества, затем переопределяем массив config и сохраняем
		$community_config = $this->model->getConfig($this->aa->acl_data['comity_oid']);

		// пытаемся удалить элемент из других колонок
		foreach ($community_config[ 'widgets_layout' ] as $col=>$c_layout) {
			if ($column != $col) {
				$excess_elements = array_intersect($c_layout, $layout); // сначала поймем какие элементы у нас остались в колонках окромя той куда добавлен элемент
				foreach ($excess_elements as $key=>$value) unset($community_config[ 'widgets_layout' ][ $col ][ $key ]); // затем удалим их
			}
		}

		$community_config[ 'widgets_layout' ][ $column ] = $layout;

		// сохраняем
		$this->model->saveConfig($this->aa->acl_data['comity_oid'], $community_config);

		$this->ctx->db->end();
		$this->ctx->cp->set_data('0');

	}

	public function init()
	{
		parent::init();
		if ($this->aa->is_granted(array("community_edit")))	$this->moderator_mode = true;
	}


	public function getWidgetsConfig ()
	{
		$widgets = array();

		// получить сообщество, получить конфиг и пропарсить
		//
		// FIXME : 2008-01-15 : lucky
		// ээ.. повторно грузим сообщество из БД?

		$community_config = $this->model->getConfig($this->aa->acl_data['comity_oid']);
		if ($community_config) {
			// а теперь нужно пройтись по колонкам и находя в них id виджетов инстанцировать одноименные объекты и set-ить в них параметры
			foreach($community_config['widgets_layout'] as $column => $layout) {

				foreach ($layout as $widget_id) {
					if (!isset($community_config['widgets'][ $widget_id ])) continue;

					$w_name = $community_config['widgets'][ $widget_id ]['name'];
					$w_params = $community_config['widgets'][ $widget_id ]['params'];

					$community_config['widgets'][ $widget_id ]['params']['widget_position'] = "column".$column;
					$community_config['widgets'][ $widget_id ]['params']['widget_view'] = 'WG_'.$w_name;
					$community_config['widgets'][ $widget_id ]['params']['hp_mode'] = 1; // вывод происходит на главной странице
					if ($this->moderator_mode) {
						$community_config['widgets'][ $widget_id ]['params']['moderator_mode'] = 1; // выводить элементы управления
					}

					// пересоберем массив так чтобы виджеты всытроились в порядке прохода по массиву widgets_layout
					// временное решение
					if ($w_name) { $widgets[ (integer)$widget_id ] = $community_config['widgets'][ $widget_id ]; }
				}
			}
		}
		/*
		Добалвять "постоянные" виджеты нужно с префиксом, чтобы они не перезаписывались на виджеты динамические,
		при работе через ajax
		*/
		$widgets["w1"]=array (
				'name' => 'CreateBtnWidget',
				'params' => array(
					'widget_position' => 'createbtn',
					'widget_view' => 'WG_CreateBtnWidget',
			));

		$widgets["w2"] =array (
				'name' => 'SectionsManageWidget',
				'params' => array(
					'widget_position' => 'community_settings_widgets',
					'widget_view' => 'WG_SectionsManage',
			));

		$widgets["w3"] = array (
			'name' => 'RssWidget',
			'params' => array(
				'widget_view' => 'WG_RssWidget',
				'widget_position' => 'tags',
			),
		);

		return $widgets;

	} // end of function getWidgetsConfig

	public function process ()
	{
		// HACK : 2008-01-15 : lucky
		// валим отсюда, если нет сообщества.
		if (empty($this->aa->acl_data['comity_oid'])) return;

		$aa = &$this->aa;
		$aa->checkDeletions(array($this, "shutdown"));

		$view = $this->rh->views->findByName('index');

		$view->data = $aa->template_data;

		if ($this->moderator_mode) {
			$view->data['moderator_mode'] = 1;
			$view->data['livepage'] = 1;
		}
		$view->data['__widgets__'] = $this->widgets;

		$this->rh->useClass("RL_URLGenerator");
		$ug = new RL_URLGenerator($this->rh->router->getRule("dashboard_ajax"));
		$ug->setRouter($this->rh->router);
		$ug->setParams($this->params);

		$view->data["ajax_url"] = $ug->generateUrl();

		$this->rh->response->setContent( $view );

		// -- touch visitor stat -- {{{
		// visit member
		$this->ctx->mm->getModel("Visitable", "m")->getVisitable('Community')->visit();
		//
		// -- touch visitor stat -- }}}

	} // end of function process

}
